@file:Suppress("unused")

package com.virtualightning.mvvm.extensions

import android.view.View
import android.view.ViewGroup

///////////////////////////////////////////////////////////////////////////
// 代码分割线 on 2021/1/25 下午5:53 by CimZzz
// 以下内容为:
// View 扩展方法
///////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/10/18 11:41 AM
// 根据条件判断是否 Visible Or Gone
///////////////////////////////////////////////////////////////////////////
fun View?.visibleOrGone(isVisible: Boolean) {
    if(isVisible) {
        this.toVisible()
    }
    else {
        this.toGone()
    }
}

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/1/25 下午5:55
// 显示 View
///////////////////////////////////////////////////////////////////////////
fun View?.toVisible() {
    this?.visibility = View.VISIBLE
}

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/1/25 下午5:55
// 不显示 View
///////////////////////////////////////////////////////////////////////////
fun View?.toInvisible() {
    this?.visibility = View.INVISIBLE
}

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/1/25 下午5:55
// 隐藏 View
///////////////////////////////////////////////////////////////////////////
fun View?.toGone() {
    this?.visibility = View.GONE
}

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/3/15 下午3:03
// 设置 View 宽为 match_parent
///////////////////////////////////////////////////////////////////////////
fun View?.widthMatchParent(validImmediately: Boolean = true) {
    val layoutParams = this?.layoutParams ?: return
    layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT
    if(validImmediately) {
        this.layoutParams = layoutParams
    }
}

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/3/15 下午3:03
// 设置 View 宽为 wrap_content
///////////////////////////////////////////////////////////////////////////
fun View?.widthWrapContent(validImmediately: Boolean = true) {
    val layoutParams = this?.layoutParams ?: return
    layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT
    if(validImmediately) {
        this.layoutParams = layoutParams
    }
}

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/3/15 下午3:04
// 设置 View 高为 match_parent
///////////////////////////////////////////////////////////////////////////
fun View?.heightMatchParent(validImmediately: Boolean = true) {
    val layoutParams = this?.layoutParams ?: return
    layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
    if(validImmediately) {
        this.layoutParams = layoutParams
    }
}

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/3/15 下午3:04
// 设置 View 高为 wrap_content
///////////////////////////////////////////////////////////////////////////
fun View?.heightWrapContent(validImmediately: Boolean = true) {
    val layoutParams = this?.layoutParams ?: return
    layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT
    if(validImmediately) {
        this.layoutParams = layoutParams
    }
}

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/3/15 下午3:09
// 设置 View 内边距
///////////////////////////////////////////////////////////////////////////
fun View?.setPadding(left: Int? = null, top: Int? = null, right: Int? = null, bottom: Int? = null) {
    this?.setPadding(
        left ?: paddingLeft,
        top ?: paddingTop,
        right ?: paddingRight,
        bottom ?: paddingBottom
    )
}

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/3/15 下午3:12
// 设置 View 外边距
///////////////////////////////////////////////////////////////////////////
fun View?.setMargin(left: Int? = null, top: Int? = null, right: Int? = null, bottom: Int? = null) {
    withLayoutParams<ViewGroup.MarginLayoutParams> {
        it.leftMargin = left ?: it.leftMargin
        it.topMargin = top ?: it.topMargin
        it.rightMargin = right ?: it.rightMargin
        it.bottomMargin = bottom ?: it.bottomMargin
    }
}

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/3/15 下午3:13
// 操作 View 的 LayoutParams
///////////////////////////////////////////////////////////////////////////
inline fun <reified T: ViewGroup.LayoutParams> View?.withLayoutParams(callback: (T) -> Unit) {
    val layoutParams = this?.layoutParams ?: return
    if(layoutParams is T) {
        callback(layoutParams)
    }
}

///////////////////////////////////////////////////////////////////////////
// Add by CimZzz on 2021/1/25 下午5:57
// 遍历 ViewGroup
///////////////////////////////////////////////////////////////////////////
fun ViewGroup.forEach(callback: (View) -> Unit) {
    for(i in 0 until childCount) {
        callback(getChildAt(i))
    }
}

/**
 * 遍历 ViewGroup, 找到顶部 View
 * @receiver ViewGroup
 * @param predict Function1<View, Boolean>
 * @return View?
 */
fun ViewGroup.findView(predict: (View) -> Boolean): View? {
    for(i in 0 until childCount) {
        val view = getChildAt(i)
        if(predict(view)) {
            return view
        }
    }

    return null
}

/**
 * 遍历 ViewGroup, 找到顶部 View
 * @receiver ViewGroup
 * @param predict Function1<View, Boolean>
 * @return Int
 */
fun ViewGroup.findViewIndex(predict: (View) -> Boolean): Int {
    for(i in 0 until childCount) {
        val view = getChildAt(i)
        if(predict(view)) {
            return i
        }
    }

    return -1
}